package juc;

import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.TransferQueue;

/**
 * Description:
 *      两个线程交替输出
 *                 第一个线程：1 2 3 4 5 6 7
 *                 第二个线程： A B C D E F G
 *        输出结果：1A2B3C4D5E6F7G
 */
public class Test08 {

    public static void main(String[] args) throws Exception{

        // 阻塞队列，队列里最多只能放一个元素，
        // 而且一个线程调用transfer放元素的时候，如果没有另一个线程调用take去取走元素，则放元素的线下必须阻塞在这个位置
        TransferQueue<Character> tq = new LinkedTransferQueue<>();

        char[] nums = "1234567".toCharArray();
        char[] chars = "ABCDEFG".toCharArray();

        Thread t1 = new Thread(()->{
            try{
                for(char temp: nums){
                    tq.transfer(temp); // 当前线程放一个元素进队列，并阻塞在这里，等待另一个线程拿走这个元素，才能往下执行
                    System.out.println(tq.take());// 从队列中拿走另一个线程放的元素,如果没有元素也会阻塞
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"t1");

        Thread t2 = new Thread(()->{

            try{
                for(char temp: chars){
                    System.out.println(tq.take());
                    tq.transfer(temp);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        },"t2");

        t2.start();
        t1.start();
    }
}

